为什么把d.p[i]换成d->p[i]就有段错误

来源:百度知道 编辑:UC知道 时间:2024/06/24 14:54:07
#include<stdio.h>

struct cc{
int handle;
};

typedef struct dd{
struct cc *p;
};

int main()
{
struct dd d;
d.p = (struct cc *)malloc(sizeof(struct cc));
printf("%s %d\n", __func__ ,__LINE__);
int i;
#if 1
for(i = 0; i < 10; i++)
{
d.p[i].handle = i;
}
#else
d->p[0] = 0;
#endif
printf("%s %d\n", __func__ ,__LINE__);
for(i = 0; i < 10; i++)
{
printf("%d\n",d.p[i].handle);
}

printf("%s %d\n", __func__ ,__LINE__);
return 0;
}

我把 struct dd d;换成 struct dd *d;d.p 换成d->p,为啥会出现段错误。谢谢大家帮我解答

换成struct dd* d以后,d没有初始化或者赋值就使用了,这时的d是个不确定的值,往一个不确定的地址里面写数据或者读数据是不允许的

因为*d也要初始化...

你仔细看你自己写的程序其实就找到问题所在了。

p是 结构体cc 的指针,那么在使用前你对 p 做了申请内存的操作
d.p = (struct cc *)malloc(sizeof(struct cc));

同样的道理啊,你要是是用结构体dd的指针,也要这么操作后再用,对吧?

struct *d 只是定义了一个指针 并没有定义这个指针指向的位置 或者说 不存在d指向的结构体 你用d->p自然出错
struct d 定义了一个结构体 这个结构体已经存在了

正确的写法应该是 struct dd *d = (struct dd *)malloc(sizeof(struct dd));

struct dd *d;
d = (struct dd*)
malloc(sizeof(struct dd));//使用指针前记得分配内存或指向已经分配的内存!
d->p = (struct cc *)malloc(sizeof(struct cc));